<?php
/**
 * Clase que gestiona las usuarios
 */
class Usuario{
	/**
	 * Clase para la conexión a la BBDD
	 * @var Object
	 */
	private $MySQL;
	
	/**
	 * Identificador
	 * @var integer
	 */
	private $id;
	
	/**
	 * Password
	 * @var string
	 */
	private $password;

        /**
         * Nombre del usuario
         * @var <string>
         */
	private $nombre;

        /**
         * Indica si el usuario es administrador
         * @var <bool>
         */
	private $es_admin;

        /**
         * Lista de canciones subidas por el usuario
         * @var <array> de objetos Cancion
         */
	private $lista_canciones;

        /**
         * Lista de comentarios leídos por el usuario
         * @var <array> de arrays con la información del comentario
         */
        private $comentarios_leidos;

        /**
         * Array con los ids de las canciones favoritas del usuario
         * @var <array>  de objetos Cancion
         */
        private $lista_favoritas;

        /**
         * Array con Objetos ListaReproduccion con las listas de reproduccion del usuario
         * @var <type> de objetos ListaReproduccion
         */
        private $listas_reproduccion;

        /**
         * Indica si se ha subido una imagen
         * @var <bool>
         */
        private $imagen;

	/*
	 * Métodos de la Clase.
	 ***********************/	

	/**
	 * Constructor
	 * 
	 * Si recibe un identificador válido, se carga la usuario de la BBDD mediante el método {@link cargar()}, en caso contrario crea un objeto
	 * vacío.
	 * @see cargar()
	 * 
	 * @param integer $id
	 */
	public function __construct($id_usuario=null){
		$Validar = new Validar();
		$this->MySQL = new MySQL('MYLIED');
		
		if($id_usuario){
			$this->id = $id_usuario;
			$this->cargar();
		}
	}

	/**
	 * Carga todos los datos para el usuario en la BBDD.
	 * 
	 * Este método es invocado cuando se le pasa un id de Usuario válido al constructor, y a partir
	 * de éste se cargan todos sus datos de la BBDD.
	 */
	private function cargar(){
            try{
                if($this->id){
                    $query_usuario = "SELECT *
                                        FROM usuarios
                                        WHERE id = '$this->id'; ";
                    if(!($result = $this->MySQL->query($query_usuario)))
                            throw new Exception("Error al cargar la canci&oacute;n");
                    else if(mysql_num_rows($result) == 0)
                            throw new Exception("La informaci&oacute;n del usuario no est&aacute; disponible.");

                    $row = mysql_fetch_array($result);

                    $this->password = $row['password'];
                    $this->nombre = $row['nombre'];
                    $this->es_admin = $row['es_admin'];
                    $this->imagen = $row['imagen'];

                    $this->cargar_Canciones();
                    $this->cargar_Comentarios_Leidos();
                    $this->cargar_Favoritas();
                    $this->cargar_Listas_Reproduccion();
                }
            }catch(Exception $e){}
	}	
	
	private function cargar_Canciones(){
		$listaCanciones = new ListaCanciones();
		$filtros['usuario'] = $this->id;
		$listaCanciones->buscar($filtros);
		
		while($cancion=$listaCanciones->siguiente()){
                    $this->lista_canciones[$cancion->get_Id()] = $cancion;
		}
	}

        private function cargar_Listas_Reproduccion(){
            $listaListas = new ListaListasReproduccion();
            $filtros['usuario'] = $this->id;
            $listaListas->buscar($filtros);

            while($lista=$listaListas->siguiente()){
                $this->listas_reproduccion[$lista->get_Id()] = $lista;
            }
        }

        private function cargar_Favoritas(){
            $this->lista_favoritas = array();
            $query = "SELECT fk_cancion as id_cancion FROM listas_favoritas WHERE fk_usuario='$this->id'";

            if(!($rs = $this->MySQL->query($query))){
                throw new Exception('Error al cargar la lista de favoritas');
            }

            while($row =  mysql_fetch_array($rs)){
                $this->lista_favoritas[$row['id_cancion']] = new Cancion($row['id_cancion']);
            }
	}

        private function cargar_Comentarios_Leidos(){
            $this->comentarios_leidos = array();
            $query = "SELECT fk_comentario as id_comentario FROM comentarios_leidos_usuarios WHERE fk_usuario='$this->id'";

            if(!($rs = $this->MySQL->query($query))){
                throw new Exception('Error al cargar los comentarios le&iacute;dos');
            }

            while($row =  mysql_fetch_array($rs)){
                $this->comentarios_leidos[] = $row['id_comentario'];
            }
        }
	
	/**
	 * Devuelve el id del disco
	 * 
	 * @return integer $id Id de la usuario.
	 */
	public function get_Id(){
		return $this->id;
	}
	
	/**
	 * Devuelve el tipo de usuario
	 * 
	 * @return string $password
	 */
	public function get_Password(){
		return $this->password;	
	}

        /**
         * Devuelve el nombre
         * @return <string>
         */
	public function get_Nombre(){
		return $this->nombre;
	}

        /**
         * Indica si es administrador
         * @return <bool>
         */
	public function es_Admin(){
		return $this->es_admin;	
	}

        /**
         * Devuelve la lista de canciones subidas por el usuario
         * @return <array> de objetos Cancion
         */
	public function get_Lista_Canciones(){
		return $this->lista_canciones;
	}

        /**
         * Devuelve las listas de reproducción del usuario
         * @return <array> de objetos ListaReproduccion
         */
        public function get_Listas_Reproduccion(){
		return $this->listas_reproduccion;
	}

        /**
         * Devuelve la lista de canciones favoritas
         * @return <array> de objetos Cancion
         */
        public function get_Lista_Favoritas(){
            return $this->lista_favoritas;
        }

        /**
         * Indica si una canción es favorita del usuario
         * @param <integer> $id_cancion id de la cación
         * @return <type>
         */
        public function es_Favorita($id_cancion){
            if($this->lista_favoritas)
                return in_array($id_cancion, array_keys($this->lista_favoritas));
            else return false;
        }

        /**
         * Número de canciones subidas hoy
         * @return <integer>
         */
        public function get_Num_Canciones_Hoy(){
            $query = "SELECT COUNT(id) as num FROM canciones WHERE fk_usuario='$this->id' AND fecha>'".Fechas::fechaActualTimeStamp()."' ";
            $rs = mysql_query($query);
           
            if($row = mysql_fetch_array($rs))
                return $row['num'];
            
            return 0;
        }

        /**
         * Cambia el id, esto no debería hacerse..
         * @param <type> $id
         */
	public function set_Id($id){
		if($id != ''){
			$query = "UPDATE usuarios SET id='$id' WHERE id='$this->id';";
			if(!$this->MySQL->query($query))
				throw new Exception("Error al editar el id del usuario");
			$this->id = $id;
		}
	}

        /**
         * Cambia el password
         * @param <type> $pass
         */
	public function set_Password($pass){
		if($pass != ''){
			$pass = PAux::encode($pass);
			$query = "UPDATE usuarios SET password='$pass' WHERE id='$this->id';";
			if(!$this->MySQL->query($query))
				throw new Exception("Error al editar el password del usuario");
			$this->password = $pass;
		}
	}

        /**
         * Dar/quitar privilegios de administrador
         * @param <type> $admin
         */
	public function set_Admin($admin){
		if($admin != ''){
			$query = "UPDATE usuarios SET es_admin='$admin' WHERE id='$this->id';";
			if(!$this->MySQL->query($query))
				throw new Exception("Error al editar el permiso del usuario");
			$this->es_admin = $admin;
		}
	}

        /**
         * Cambia el nombre
         * @param <type> $nombre
         */
	public function set_Nombre($nombre){
		if($nombre != ''){
			$query = "UPDATE usuarios SET nombre='$nombre' WHERE id='$this->id';";
			if(!$this->MySQL->query($query))
				throw new Exception("Error al editar el nombre del usuario");
			$this->nombre = $nombre;
		}
	}
	/**
	 * Borra el usuario de la BBDD
	 */
	public function del_Usuario(){
		$query = "DELETE FROM usuarios WHERE id='$this->id'";
		$this->MySQL->query($query);
		
		if($this->lista_canciones)
		foreach($this->lista_canciones as $cancion){
			$cancion->del_Cancion();
		}
	}
        /**
         * Crear usuario. Lanza excepciones en caso de errores
         * @param <type> $datos
         * @return <type>
         */
	public function crear($datos){FB::info($datos);
		
		//Comprobando los datos "imprescindibles":
		$errores = '';
		if($datos['id_usuario'] == '' || ! isset($datos['id_usuario']))
			$errores .= "El id de usuario es obligatorio.";
		/*if($datos['password'] == '' || ! isset($datos['password']))
			$errores .= "El password es obligatorio.";*/
		if($datos['nombre'] == '' || ! isset($datos['nombre']))
			$errores .= "El nombre es obligatorio.";
		
		if($errores != '') {
			throw new Exception($errores);
		}
		
		$this->id = stripslashes(trim(mysql_real_escape_string($datos['id_usuario'])));
	//	$this->password = PAux::encode($datos['password']);
		$this->nombre = stripslashes(trim(mysql_real_escape_string($datos['nombre'])));
		
		$this->guardar();
		
		return $this->id;
	}
	
	/**
	 * Guarda en la BBDD los datos del usuario
	 */
	private function guardar(){
		$query = "INSERT INTO usuarios (id, nombre) 
							VALUES (
									'$this->id',
									'$this->nombre'
									);"; 
		if(!$this->MySQL->query($query))
			throw new Exception("Error al crear el usuario");
									
		$this->id = mysql_insert_id();
	}

        /**
         * Marca como leídos todos los comentarios de una canción dada.
         * @param <integer> $id_cancion
         */
        public function leer_Comentarios($id_cancion){
            $Cancion = new Cancion($id_cancion);
            $comments = array();

            foreach($Cancion->get_Comentarios() as $comentario){
                if(!$this->comentario_Leido($comentario['id'])){
                    $comments[] = $comentario['id'];
                }
            }

            if(count($comments) > 0){
                $query = "INSERT INTO comentarios_leidos_usuarios (fk_usuario, fk_comentario) VALUES ('$this->id', '".$comments[0]."') ";

                $counter = 1;
                while($counter < count($comments)){
                    $query .= " , ('$this->id', '".$comments[$counter]."') ";
                    $counter++;
                }

                if(!$this->MySQL->query($query))
                    throw new Exception ('Error al leer el comentario'.$query);
            }
        }

        /**
         * Indica si el comentario pasado está leído
         * @param <type> $id_comentario
         * @return <type>
         */
        private function comentario_Leido($id_comentario){
            if($this->comentarios_leidos)
                return in_array($id_comentario, $this->comentarios_leidos);
            return false;
        }

        /**
         * Indica si el usuario ha escrito un comentario dado
         * @param <integer> $id_comentario
         * @return <bool>
         */
        public function ha_Escrito($id_comentario){
            $Comentario = new Comentario($id_comentario);

            if($Comentario->get_Id_Usuario() == $this->id)
                    return true;

            return false;
        }

        /**
         * Indica si el usuario tiene comentarios no leidos en una canción
         * @param <integer> $id_cancion
         * @return <bool>
         */
        public function tiene_Comentarios_Sin_Leer($id_cancion){
            $cancion = new Cancion($id_cancion);

            foreach($cancion->get_Comentarios() as $comentario){
                if($this->comentarios_leidos){
                    if(!in_array($comentario['id'], $this->comentarios_leidos))
                        return TRUE;                    
                }
                else
                    return TRUE;
            }
            return FALSE;
        }

        /**
         * Añade la canción dada a la lista de favoritas
         * @param <type> $id_cancion
         */
        public function add_Favorita($id_cancion){
            if(!in_array($id_cancion, array_keys($this->lista_favoritas))){
                $query = "INSERT INTO listas_favoritas (fk_usuario, fk_cancion) VALUES ('$this->id','$id_cancion');";

                if(!$this->MySQL->query($query))
                    throw new Exception("Error al a&ntilde;adir la canci&oacute;n a la lista de favoritas");
            }
        }

        /**
         * Elimina la canción dada de la lista de favoritas
         * @param <type> $id_cancion
         */
        public function del_Favorita($id_cancion){
            if(in_array($id_cancion, array_keys($this->lista_favoritas))){
                $query = "DELETE FROM listas_favoritas WHERE fk_cancion='$id_cancion';";

                if(!$this->MySQL->query($query))
                    throw new Exception("Error al eliminar la canci&oacute;n de la lista de favoritas");
            }
        }

        /**
         * Elimina todas las canciones favoritas
         */
        public function del_Favoritas($ids_canciones){
            foreach($ids_canciones as $id_cancion)
                $this->del_Favorita ($id_cancion);
        }

        /**
         * Añade las canciones dadas a la lista de favoritas
         * @param <type> $ids_canciones
         */
        public function add_Favoritas($ids_canciones){
            foreach($ids_canciones as $id_cancion)
                $this->add_Favorita ($id_cancion);
        }

        /**
         * Crea una lista de reproduccion con un nombre y unas canciones dadas (opcional)
         * @param <type> $nombre
         * @param <type> $ids_canciones
         */
        public function crear_Lista_Reproduccion($nombre, $ids_canciones=null){
            $lista = new ListaReproduccion();
            $datos = array('id_usuario' => $this->id, 'nombre' => $nombre, 'canciones' => $ids_canciones);

            $lista->crear($datos);
        }

        public function set_Imagen_Subida(){
            $query = " UPDATE usuarios SET imagen='1' WHERE id = '$this->id';"; FB::warn($query);
            if(!$this->MySQL->query($query))
                throw new Exception ('Error al marcar la imagen como subida');

            $this->imagen = 1;
        }

        public function get_Imagen(){
            if($this->imagen)
                return $this->id;

            return 'avatar.gif';
        }
}
?>